Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/frontend/public/rnode-flasher/js/rnode.js 9c739fa940d1bcaefcd5de9a3b461762a7200103 (9c739fa9) Text, 24.38 KB

Tff7b72class Te6edf3Utils Tb4b4b4{
T8b949e/**
* Waits for the provided milliseconds, and then resolves.
* @param millis
* @returns {Promise<void>}
*/
Tff7b72static Tff7b72async Te6edf3sleepMillisTb4b4b4(Te6edf3millisTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3setTimeoutTb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3millisTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3bytesToHexTb4b4b4(Te6edf3bytesTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72var Te6edf3hex Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4, Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3bytesTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3current Tff7b72= Te6edf3bytesTb4b4b4[Te6edf3iTb4b4b4] Tff7b72< T79c0ff0 Tff7b72? Te6edf3bytesTb4b4b4[Te6edf3iTb4b4b4] Tff7b72+ T79c0ff256 Tff7b72: Te6edf3bytesTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Te6edf3hexTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4(Te6edf3current Tff7b72>>> T79c0ff4Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3hexTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4(Te6edf3current Tff7b72& T79c0ff0xfTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3hexTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3md5Tb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3bytes Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3hash Tff7b72= Te6edf3CryptoJSTb4b4b4.Te6edf3MD5Tb4b4b4(Te6edf3CryptoJSTb4b4b4.Te6edf3encTb4b4b4.Te6edf3HexTb4b4b4.Te6edf3parseTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bytesToHexTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72var Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3hashTb4b4b4.Te6edf3sigBytesTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3bytesTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4(Te6edf3hashTb4b4b4.Te6edf3wordsTb4b4b4[Te6edf3i Tff7b72>>> T79c0ff2Tb4b4b4] Tff7b72>>> Tb4b4b4(T79c0ff24 Tff7b72- Tb4b4b4(Te6edf3i Tff7b72% T79c0ff4Tb4b4b4) Tff7b72* T79c0ff8Tb4b4b4)Tb4b4b4) Tff7b72& T79c0ff0xffTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3bytesTb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3packUInt32BETb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3buffer Tff7b72= Tff7b72new Tffa657ArrayBufferTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3view Tff7b72= Tff7b72new Tffa657DataViewTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4;
Te6edf3viewTb4b4b4.Te6edf3setUint32Tb4b4b4(T79c0ff0Tb4b4b4, Te6edf3valueTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3unpackUInt32BETb4b4b4(Te6edf3byteArrayTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3buffer Tff7b72= Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3byteArrayTb4b4b4)Tb4b4b4.Te6edf3bufferTb4b4b4;
Tff7b72const Te6edf3view Tff7b72= Tff7b72new Tffa657DataViewTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3viewTb4b4b4.Te6edf3getUint32Tb4b4b4(T79c0ff0Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72class Te6edf3RNode Tb4b4b4{
Te6edf3KISS_FEND Tff7b72= T79c0ff0xc0Tb4b4b4;
Te6edf3KISS_FESC Tff7b72= T79c0ff0xdbTb4b4b4;
Te6edf3KISS_TFEND Tff7b72= T79c0ff0xdcTb4b4b4;
Te6edf3KISS_TFESC Tff7b72= T79c0ff0xddTb4b4b4;

Te6edf3CMD_FREQUENCY Tff7b72= T79c0ff0x01Tb4b4b4;
Te6edf3CMD_BANDWIDTH Tff7b72= T79c0ff0x02Tb4b4b4;
Te6edf3CMD_TXPOWER Tff7b72= T79c0ff0x03Tb4b4b4;
Te6edf3CMD_SF Tff7b72= T79c0ff0x04Tb4b4b4;
Te6edf3CMD_CR Tff7b72= T79c0ff0x05Tb4b4b4;
Te6edf3CMD_RADIO_STATE Tff7b72= T79c0ff0x06Tb4b4b4;

Te6edf3CMD_STAT_RX Tff7b72= T79c0ff0x21Tb4b4b4;
Te6edf3CMD_STAT_TX Tff7b72= T79c0ff0x22Tb4b4b4;
Te6edf3CMD_STAT_RSSI Tff7b72= T79c0ff0x23Tb4b4b4;
Te6edf3CMD_STAT_SNR Tff7b72= T79c0ff0x24Tb4b4b4;

Te6edf3CMD_BOARD Tff7b72= T79c0ff0x47Tb4b4b4;
Te6edf3CMD_PLATFORM Tff7b72= T79c0ff0x48Tb4b4b4;
Te6edf3CMD_MCU Tff7b72= T79c0ff0x49Tb4b4b4;
Te6edf3CMD_RESET Tff7b72= T79c0ff0x55Tb4b4b4;
Te6edf3CMD_RESET_BYTE Tff7b72= T79c0ff0xf8Tb4b4b4;
Te6edf3CMD_DEV_HASH Tff7b72= T79c0ff0x56Tb4b4b4;
Te6edf3CMD_FW_VERSION Tff7b72= T79c0ff0x50Tb4b4b4;
Te6edf3CMD_ROM_READ Tff7b72= T79c0ff0x51Tb4b4b4;
Te6edf3CMD_ROM_WRITE Tff7b72= T79c0ff0x52Tb4b4b4;
Te6edf3CMD_CONF_SAVE Tff7b72= T79c0ff0x53Tb4b4b4;
Te6edf3CMD_CONF_DELETE Tff7b72= T79c0ff0x54Tb4b4b4;
Te6edf3CMD_FW_HASH Tff7b72= T79c0ff0x58Tb4b4b4;
Te6edf3CMD_UNLOCK_ROM Tff7b72= T79c0ff0x59Tb4b4b4;
Te6edf3ROM_UNLOCK_BYTE Tff7b72= T79c0ff0xf8Tb4b4b4;
Te6edf3CMD_HASHES Tff7b72= T79c0ff0x60Tb4b4b4;
Te6edf3CMD_FW_UPD Tff7b72= T79c0ff0x61Tb4b4b4;
Te6edf3CMD_DISP_ROT Tff7b72= T79c0ff0x67Tb4b4b4;
Te6edf3CMD_DISP_RCND Tff7b72= T79c0ff0x68Tb4b4b4;

Te6edf3CMD_BT_CTRL Tff7b72= T79c0ff0x46Tb4b4b4;
Te6edf3CMD_BT_PIN Tff7b72= T79c0ff0x62Tb4b4b4;

Te6edf3CMD_DISP_READ Tff7b72= T79c0ff0x66Tb4b4b4;

Te6edf3CMD_DETECT Tff7b72= T79c0ff0x08Tb4b4b4;
Te6edf3DETECT_REQ Tff7b72= T79c0ff0x73Tb4b4b4;
Te6edf3DETECT_RESP Tff7b72= T79c0ff0x46Tb4b4b4;

Te6edf3RADIO_STATE_OFF Tff7b72= T79c0ff0x00Tb4b4b4;
Te6edf3RADIO_STATE_ON Tff7b72= T79c0ff0x01Tb4b4b4;
Te6edf3RADIO_STATE_ASK Tff7b72= T79c0ff0xffTb4b4b4;

Te6edf3CMD_ERROR Tff7b72= T79c0ff0x90Tb4b4b4;
Te6edf3ERROR_INITRADIO Tff7b72= T79c0ff0x01Tb4b4b4;
Te6edf3ERROR_TXFAILED Tff7b72= T79c0ff0x02Tb4b4b4;
Te6edf3ERROR_EEPROM_LOCKED Tff7b72= T79c0ff0x03Tb4b4b4;

Te6edf3PLATFORM_AVR Tff7b72= T79c0ff0x90Tb4b4b4;
Te6edf3PLATFORM_ESP32 Tff7b72= T79c0ff0x80Tb4b4b4;
Te6edf3PLATFORM_NRF52 Tff7b72= T79c0ff0x70Tb4b4b4;

Te6edf3MCU_1284P Tff7b72= T79c0ff0x91Tb4b4b4;
Te6edf3MCU_2560 Tff7b72= T79c0ff0x92Tb4b4b4;
Te6edf3MCU_ESP32 Tff7b72= T79c0ff0x81Tb4b4b4;
Te6edf3MCU_NRF52 Tff7b72= T79c0ff0x71Tb4b4b4;

Te6edf3BOARD_RNODE Tff7b72= T79c0ff0x31Tb4b4b4;
Te6edf3BOARD_HMBRW Tff7b72= T79c0ff0x32Tb4b4b4;
Te6edf3BOARD_TBEAM Tff7b72= T79c0ff0x33Tb4b4b4;
Te6edf3BOARD_HUZZAH32 Tff7b72= T79c0ff0x34Tb4b4b4;
Te6edf3BOARD_GENERIC_ESP32 Tff7b72= T79c0ff0x35Tb4b4b4;
Te6edf3BOARD_LORA32_V2_0 Tff7b72= T79c0ff0x36Tb4b4b4;
Te6edf3BOARD_LORA32_V2_1 Tff7b72= T79c0ff0x37Tb4b4b4;
Te6edf3BOARD_RAK4631 Tff7b72= T79c0ff0x51Tb4b4b4;

Te6edf3HASH_TYPE_TARGET_FIRMWARE Tff7b72= T79c0ff0x01Tb4b4b4;
Te6edf3HASH_TYPE_FIRMWARE Tff7b72= T79c0ff0x02Tb4b4b4;

Tff7b72constructorTb4b4b4(Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3serialPort Tff7b72= Te6edf3serialPortTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3reader Tff7b72= Te6edf3serialPortTb4b4b4.Te6edf3readableTb4b4b4.Te6edf3getReaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3writable Tff7b72= Te6edf3serialPortTb4b4b4.Te6edf3writableTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3callbacks Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3readLoopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tff7b72async Te6edf3fromSerialPortTb4b4b4(Te6edf3serialPortTb4b4b4) Tb4b4b4{
T8b949e// open port
Tff7b72await Te6edf3serialPortTb4b4b4.Te6edf3openTb4b4b4(Tb4b4b4{
Te6edf3baudRateTff7b72: T79c0ff115200Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72return Tff7b72new Te6edf3RNodeTb4b4b4(Te6edf3serialPortTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3closeTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// release reader lock
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3readerTb4b4b4.Te6edf3releaseLockTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e//console.log("failed to release lock on serial port readable, ignoring...", e);
Tb4b4b4}

T8b949e// close serial port
Tff7b72try Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
T8b949e//console.log("failed to close serial port, ignoring...", e);
Tb4b4b4}
Tb4b4b4}

Tff7b72async Te6edf3writeTb4b4b4(Te6edf3bytesTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3writer Tff7b72= Tff7b72thisTb4b4b4.Te6edf3writableTb4b4b4.Te6edf3getWriterTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72await Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3bytesTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Te6edf3writerTb4b4b4.Te6edf3releaseLockTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72async Te6edf3readLoopTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72let Te6edf3buffer Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72let Te6edf3inFrame Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72while Tb4b4b4(Tff7b72trueTb4b4b4) Tb4b4b4{
T8b949e// read kiss frames until reader indicates it's done
Tff7b72const Tb4b4b4{ Te6edf3valueTb4b4b4, Te6edf3done Tb4b4b4} Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3readerTb4b4b4.Te6edf3readTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3doneTb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}

T8b949e// read kiss frames
Tff7b72for Tb4b4b4(Tff7b72const Tff7b72byte Tff7b72of Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72byte Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3KISS_FENDTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3inFrameTb4b4b4) Tb4b4b4{
T8b949e// End of frame
Tff7b72const Te6edf3decodedFrame Tff7b72= Tff7b72thisTb4b4b4.Te6edf3decodeKissFrameTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3decodedFrameTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3onCommandReceivedTb4b4b4(Te6edf3decodedFrameTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3warnTb4b4b4(Ta5d6ff"Invalid frame ignored."Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3buffer Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3inFrame Tff7b72= Tff7b72!Te6edf3inFrameTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3inFrameTb4b4b4) Tb4b4b4{
Te6edf3bufferTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72byteTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
T8b949e// ignore error if reader was released
Tff7b72if Tb4b4b4(Te6edf3error Tff7b72instanceof Tf85149TypeErrorTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Error reading from serial port: "Tb4b4b4, Te6edf3errorTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3readerTb4b4b4.Te6edf3releaseLockTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3onCommandReceivedTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// get received command and bytes from data
Tff7b72const Tb4b4b4[Te6edf3commandTb4b4b4, Tb4b4b4...Te6edf3bytesTb4b4b4] Tff7b72= Te6edf3dataTb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"onCommandReceived"Tb4b4b4, Ta5d6ff"0x" Tff7b72+ Te6edf3commandTb4b4b4.Te6edf3toStringTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4, Te6edf3bytesTb4b4b4)Tb4b4b4;

T8b949e// find callback for received command
Tff7b72const Te6edf3callback Tff7b72= Tff7b72thisTb4b4b4.Te6edf3callbacksTb4b4b4[Te6edf3commandTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3callbackTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// fire callback
Te6edf3callbackTb4b4b4(Te6edf3bytesTb4b4b4)Tb4b4b4;

T8b949e// forget callback
Tff7b72delete Tff7b72thisTb4b4b4.Te6edf3callbacksTb4b4b4[Te6edf3commandTb4b4b4]Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"failed to handle received command"Tb4b4b4, Te6edf3dataTb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3decodeKissFrameTb4b4b4(Te6edf3frameTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3data Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72let Te6edf3escaping Tff7b72= Tff7b72falseTb4b4b4;

Tff7b72for Tb4b4b4(Tff7b72const Tff7b72byte Tff7b72of Te6edf3frameTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3escapingTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72byte Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3KISS_TFENDTb4b4b4) Tb4b4b4{
Te6edf3dataTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3KISS_FENDTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72byte Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3KISS_TFESCTb4b4b4) Tb4b4b4{
Te6edf3dataTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3KISS_FESCTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4; T8b949e// Invalid escape sequence
Tb4b4b4}
Te6edf3escaping Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72byte Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3KISS_FESCTb4b4b4) Tb4b4b4{
Te6edf3escaping Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3dataTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72byteTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// return null if incomplete escape at end
Tff7b72return Te6edf3escaping Tff7b72? Tff7b72null Tff7b72: Te6edf3dataTb4b4b4;
Tb4b4b4}

Te6edf3createKissFrameTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3frame Tff7b72= Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3KISS_FENDTb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Tff7b72byte Tff7b72of Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72byte Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3KISS_FENDTb4b4b4) Tb4b4b4{
Te6edf3frameTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3KISS_FESCTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3KISS_TFENDTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72byte Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3KISS_FESCTb4b4b4) Tb4b4b4{
Te6edf3frameTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3KISS_FESCTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3KISS_TFESCTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3frameTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72byteTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3frameTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3KISS_FENDTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3frameTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3sendKissCommandTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3writeTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3createKissFrameTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// sends a command to the rnode, and resolves the promise with the result
Tff7b72async Te6edf3sendCommandTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72new Tffa657PromiseTb4b4b4(Tff7b72async Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// listen for response
Tff7b72thisTb4b4b4.Te6edf3callbacksTb4b4b4[Te6edf3commandTb4b4b4] Tff7b72= Tb4b4b4(Te6edf3responseTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3resolveTb4b4b4(Te6edf3responseTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;

T8b949e// send command
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Te6edf3commandTb4b4b4, Tb4b4b4...Te6edf3dataTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3rejectTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3resetTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_RESETTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3CMD_RESET_BYTETb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3detectTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72new Tffa657PromiseTb4b4b4(Tff7b72async Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// timeout after provided millis
Tff7b72const Te6edf3timeout Tff7b72= Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3resolveTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff2000Tb4b4b4)Tb4b4b4;

T8b949e// detect rnode
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_DETECTTb4b4b4, Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3DETECT_REQTb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// we no longer want to timeout
Te6edf3clearTimeoutTb4b4b4(Te6edf3timeoutTb4b4b4)Tb4b4b4;

T8b949e// device is an rnode if response is as expected
Tff7b72const Tb4b4b4[Te6edf3responseByteTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72const Te6edf3isRnode Tff7b72= Te6edf3responseByte Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3DETECT_RESPTb4b4b4;
Te6edf3resolveTb4b4b4(Te6edf3isRnodeTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3resolveTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getFirmwareVersionTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_FW_VERSIONTb4b4b4, Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72var Tb4b4b4[Te6edf3majorVersionTb4b4b4, Te6edf3minorVersionTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3minorVersionTb4b4b4.Te6edf3length Tff7b72=== T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3minorVersion Tff7b72= Ta5d6ff"0" Tff7b72+ Te6edf3minorVersionTb4b4b4;
Tb4b4b4}

T8b949e// 1.23
Tff7b72return Te6edf3majorVersion Tff7b72+ Ta5d6ff"." Tff7b72+ Te6edf3minorVersionTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getPlatformTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_PLATFORMTb4b4b4, Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3platformByteTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3platformByteTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getMcuTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_MCUTb4b4b4, Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3mcuByteTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3mcuByteTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getBoardTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_BOARDTb4b4b4, Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3boardByteTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3boardByteTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getDeviceHashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_DEV_HASHTb4b4b4, Tb4b4b4[
T79c0ff0x01Tb4b4b4, T8b949e// anything != 0x00
Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Tb4b4b4...Te6edf3deviceHashTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3deviceHashTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getTargetFirmwareHashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_HASHESTb4b4b4, Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3HASH_TYPE_TARGET_FIRMWARETb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3hashTypeTb4b4b4, Tb4b4b4...Te6edf3targetFirmwareHashTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3targetFirmwareHashTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getFirmwareHashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_HASHESTb4b4b4, Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3HASH_TYPE_FIRMWARETb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3hashTypeTb4b4b4, Tb4b4b4...Te6edf3firmwareHashTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3firmwareHashTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getRomTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_ROM_READTb4b4b4, Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Tb4b4b4...Te6edf3eepromBytesTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3eepromBytesTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getFrequencyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3CMD_FREQUENCYTb4b4b4,
Tb4b4b4[
T8b949e// request frequency by sending zero as 4 bytes
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4,
Tb4b4b4]
Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Tb4b4b4...Te6edf3frequencyBytesTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;

T8b949e// convert 4 bytes to 32bit integer representing frequency in hertz
Tff7b72const Te6edf3frequencyInHz Tff7b72=
Tb4b4b4(Te6edf3frequencyBytesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<< T79c0ff24Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3frequencyBytesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3frequencyBytesTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3frequencyBytesTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72return Te6edf3frequencyInHzTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getBandwidthTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3CMD_BANDWIDTHTb4b4b4,
Tb4b4b4[
T8b949e// request bandwidth by sending zero as 4 bytes
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4,
Tb4b4b4]
Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Tb4b4b4...Te6edf3bandwidthBytesTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;

T8b949e// convert 4 bytes to 32bit integer representing bandwidth in hertz
Tff7b72const Te6edf3bandwidthInHz Tff7b72=
Tb4b4b4(Te6edf3bandwidthBytesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<< T79c0ff24Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3bandwidthBytesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3bandwidthBytesTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3bandwidthBytesTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72return Te6edf3bandwidthInHzTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getTxPowerTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_TXPOWERTb4b4b4, Tb4b4b4[
T79c0ff0xffTb4b4b4, T8b949e// request tx power
Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3txPowerTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3txPowerTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getSpreadingFactorTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_SFTb4b4b4, Tb4b4b4[
T79c0ff0xffTb4b4b4, T8b949e// request spreading factor
Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3spreadingFactorTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3spreadingFactorTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getCodingRateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_CRTb4b4b4, Tb4b4b4[
T79c0ff0xffTb4b4b4, T8b949e// request coding rate
Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3codingRateTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3codingRateTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getRadioStateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_RADIO_STATETb4b4b4, Tb4b4b4[
T79c0ff0xffTb4b4b4, T8b949e// request radio state
Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3radioStateTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3radioStateTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getRxStatTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_STAT_RXTb4b4b4, Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Tb4b4b4...Te6edf3statBytesTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;

T8b949e// convert 4 bytes to 32bit integer
Tff7b72const Te6edf3stat Tff7b72= Tb4b4b4(Te6edf3statBytesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<< T79c0ff24Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3statBytesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3statBytesTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3statBytesTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72return Te6edf3statTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getTxStatTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_STAT_TXTb4b4b4, Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Tb4b4b4...Te6edf3statBytesTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;

T8b949e// convert 4 bytes to 32bit integer
Tff7b72const Te6edf3stat Tff7b72= Tb4b4b4(Te6edf3statBytesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<< T79c0ff24Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3statBytesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3statBytesTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3statBytesTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72return Te6edf3statTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getRssiStatTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_STAT_RSSITb4b4b4, Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Te6edf3rssiTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3rssiTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3disableBluetoothTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[
Tff7b72thisTb4b4b4.Te6edf3CMD_BT_CTRLTb4b4b4,
T79c0ff0x00Tb4b4b4, T8b949e// stop
Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3enableBluetoothTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[
Tff7b72thisTb4b4b4.Te6edf3CMD_BT_CTRLTb4b4b4,
T79c0ff0x01Tb4b4b4, T8b949e// start
Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3startBluetoothPairingTb4b4b4(Te6edf3pinCallbackTb4b4b4) Tb4b4b4{
T8b949e// listen for bluetooth pin
T8b949e// pin will be available once the user has initiated pairing from an Android device
Tff7b72thisTb4b4b4.Te6edf3callbacksTb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_BT_PINTb4b4b4] Tff7b72= Tb4b4b4(Te6edf3responseTb4b4b4) Tb4b4b4=> Tb4b4b4{
T8b949e// read response from device
Tff7b72const Tb4b4b4[Tb4b4b4...Te6edf3pinBytesTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;

T8b949e// convert 4 bytes to 32bit integer
Tff7b72const Te6edf3pin Tff7b72= Tb4b4b4(Te6edf3pinBytesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<< T79c0ff24Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3pinBytesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3pinBytesTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72| Te6edf3pinBytesTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4;

T8b949e// tell user what the bluetooth pin is
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Bluetooth Pairing Pin: " Tff7b72+ Te6edf3pinTb4b4b4)Tb4b4b4;
Te6edf3pinCallbackTb4b4b4(Te6edf3pinTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;

T8b949e// enable pairing
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[
Tff7b72thisTb4b4b4.Te6edf3CMD_BT_CTRLTb4b4b4,
T79c0ff0x02Tb4b4b4, T8b949e// enable pairing
Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3readDisplayTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendCommandTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3CMD_DISP_READTb4b4b4, Tb4b4b4[T79c0ff0x01Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// read response from device
Tff7b72const Tb4b4b4[Tb4b4b4...Te6edf3displayBufferTb4b4b4] Tff7b72= Te6edf3responseTb4b4b4;
Tff7b72return Te6edf3displayBufferTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setFrequencyTb4b4b4(Te6edf3frequencyInHzTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3c1 Tff7b72= Te6edf3frequencyInHz Tff7b72>> T79c0ff24Tb4b4b4;
Tff7b72const Te6edf3c2 Tff7b72= Tb4b4b4(Te6edf3frequencyInHz Tff7b72>> T79c0ff16Tb4b4b4) Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72const Te6edf3c3 Tff7b72= Tb4b4b4(Te6edf3frequencyInHz Tff7b72>> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72const Te6edf3c4 Tff7b72= Te6edf3frequencyInHz Tff7b72& T79c0ff0xffTb4b4b4;

Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_FREQUENCYTb4b4b4, Te6edf3c1Tb4b4b4, Te6edf3c2Tb4b4b4, Te6edf3c3Tb4b4b4, Te6edf3c4Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setBandwidthTb4b4b4(Te6edf3bandwidthInHzTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3c1 Tff7b72= Te6edf3bandwidthInHz Tff7b72>> T79c0ff24Tb4b4b4;
Tff7b72const Te6edf3c2 Tff7b72= Tb4b4b4(Te6edf3bandwidthInHz Tff7b72>> T79c0ff16Tb4b4b4) Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72const Te6edf3c3 Tff7b72= Tb4b4b4(Te6edf3bandwidthInHz Tff7b72>> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72const Te6edf3c4 Tff7b72= Te6edf3bandwidthInHz Tff7b72& T79c0ff0xffTb4b4b4;

Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_BANDWIDTHTb4b4b4, Te6edf3c1Tb4b4b4, Te6edf3c2Tb4b4b4, Te6edf3c3Tb4b4b4, Te6edf3c4Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setTxPowerTb4b4b4(Te6edf3dbTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_TXPOWERTb4b4b4, Te6edf3dbTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setSpreadingFactorTb4b4b4(Te6edf3spreadingFactorTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_SFTb4b4b4, Te6edf3spreadingFactorTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setCodingRateTb4b4b4(Te6edf3codingRateTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_CRTb4b4b4, Te6edf3codingRateTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setRadioStateOnTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_RADIO_STATETb4b4b4, Tff7b72thisTb4b4b4.Te6edf3RADIO_STATE_ONTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setRadioStateOffTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_RADIO_STATETb4b4b4, Tff7b72thisTb4b4b4.Te6edf3RADIO_STATE_OFFTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// setTNCMode
Tff7b72async Te6edf3saveConfigTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_CONF_SAVETb4b4b4, T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// setNormalMode
Tff7b72async Te6edf3deleteConfigTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_CONF_DELETETb4b4b4, T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3indicateFirmwareUpdateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_FW_UPDTb4b4b4, T79c0ff0x01Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setFirmwareHashTb4b4b4(Te6edf3hashTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_FW_HASHTb4b4b4, Tb4b4b4...Te6edf3hashTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3writeRomTb4b4b4(Te6edf3addressTb4b4b4, Te6edf3valueTb4b4b4) Tb4b4b4{
T8b949e// write to rom
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_ROM_WRITETb4b4b4, Te6edf3addressTb4b4b4, Te6edf3valueTb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// wait a bit to allow device to write to rom
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff85Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3wipeRomTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_UNLOCK_ROMTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3ROM_UNLOCK_BYTETb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// wiping can take up to 30 seconds
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff30000Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72new Te6edf3ROMTb4b4b4(Te6edf3romTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3setDisplayRotationTb4b4b4(Te6edf3rotationTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_DISP_ROTTb4b4b4, Te6edf3rotation Tff7b72& T79c0ff0xffTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3startDisplayReconditioningTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendKissCommandTb4b4b4(Tb4b4b4[Tff7b72thisTb4b4b4.Te6edf3CMD_DISP_RCNDTb4b4b4, T79c0ff0x01Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72class Te6edf3ROM Tb4b4b4{
Tff7b72static Te6edf3PLATFORM_AVR Tff7b72= T79c0ff0x90Tb4b4b4;
Tff7b72static Te6edf3PLATFORM_ESP32 Tff7b72= T79c0ff0x80Tb4b4b4;
Tff7b72static Te6edf3PLATFORM_NRF52 Tff7b72= T79c0ff0x70Tb4b4b4;

Tff7b72static Te6edf3MCU_1284P Tff7b72= T79c0ff0x91Tb4b4b4;
Tff7b72static Te6edf3MCU_2560 Tff7b72= T79c0ff0x92Tb4b4b4;
Tff7b72static Te6edf3MCU_ESP32 Tff7b72= T79c0ff0x81Tb4b4b4;
Tff7b72static Te6edf3MCU_NRF52 Tff7b72= T79c0ff0x71Tb4b4b4;

Tff7b72static Te6edf3PRODUCT_RAK4631 Tff7b72= T79c0ff0x10Tb4b4b4;
Tff7b72static Te6edf3MODEL_11 Tff7b72= T79c0ff0x11Tb4b4b4;
Tff7b72static Te6edf3MODEL_12 Tff7b72= T79c0ff0x12Tb4b4b4;

Tff7b72static Te6edf3PRODUCT_RNODE Tff7b72= T79c0ff0x03Tb4b4b4;
Tff7b72static Te6edf3MODEL_A1 Tff7b72= T79c0ff0xa1Tb4b4b4;
Tff7b72static Te6edf3MODEL_A6 Tff7b72= T79c0ff0xa6Tb4b4b4;
Tff7b72static Te6edf3MODEL_A4 Tff7b72= T79c0ff0xa4Tb4b4b4;
Tff7b72static Te6edf3MODEL_A9 Tff7b72= T79c0ff0xa9Tb4b4b4;
Tff7b72static Te6edf3MODEL_A3 Tff7b72= T79c0ff0xa3Tb4b4b4;
Tff7b72static Te6edf3MODEL_A8 Tff7b72= T79c0ff0xa8Tb4b4b4;
Tff7b72static Te6edf3MODEL_A2 Tff7b72= T79c0ff0xa2Tb4b4b4;
Tff7b72static Te6edf3MODEL_A7 Tff7b72= T79c0ff0xa7Tb4b4b4;
Tff7b72static Te6edf3MODEL_A5 Tff7b72= T79c0ff0xa5Tb4b4b4;
Tff7b72static Te6edf3MODEL_AA Tff7b72= T79c0ff0xaaTb4b4b4;
Tff7b72static Te6edf3MODEL_AC Tff7b72= T79c0ff0xacTb4b4b4;

Tff7b72static Te6edf3PRODUCT_T32_10 Tff7b72= T79c0ff0xb2Tb4b4b4;
Tff7b72static Te6edf3MODEL_BA Tff7b72= T79c0ff0xbaTb4b4b4;
Tff7b72static Te6edf3MODEL_BB Tff7b72= T79c0ff0xbbTb4b4b4;

Tff7b72static Te6edf3PRODUCT_T32_20 Tff7b72= T79c0ff0xb0Tb4b4b4;
Tff7b72static Te6edf3MODEL_B3 Tff7b72= T79c0ff0xb3Tb4b4b4;
Tff7b72static Te6edf3MODEL_B8 Tff7b72= T79c0ff0xb8Tb4b4b4;

Tff7b72static Te6edf3PRODUCT_T32_21 Tff7b72= T79c0ff0xb1Tb4b4b4;
Tff7b72static Te6edf3MODEL_B4 Tff7b72= T79c0ff0xb4Tb4b4b4;
Tff7b72static Te6edf3MODEL_B9 Tff7b72= T79c0ff0xb9Tb4b4b4;
Tff7b72static Te6edf3MODEL_B4_TCXO Tff7b72= T79c0ff0x04Tb4b4b4; T8b949e// The TCXO model codes are only used here to select the
Tff7b72static Te6edf3MODEL_B9_TCXO Tff7b72= T79c0ff0x09Tb4b4b4; T8b949e// correct firmware, actual model codes in firmware is still 0xB4 and 0xB9.

Tff7b72static Te6edf3PRODUCT_H32_V2 Tff7b72= T79c0ff0xc0Tb4b4b4;
Tff7b72static Te6edf3MODEL_C4 Tff7b72= T79c0ff0xc4Tb4b4b4;
Tff7b72static Te6edf3MODEL_C9 Tff7b72= T79c0ff0xc9Tb4b4b4;

Tff7b72static Te6edf3PRODUCT_H32_V3 Tff7b72= T79c0ff0xc1Tb4b4b4;
Tff7b72static Te6edf3MODEL_C5 Tff7b72= T79c0ff0xc5Tb4b4b4;
Tff7b72static Te6edf3MODEL_CA Tff7b72= T79c0ff0xcaTb4b4b4;

Tff7b72static Te6edf3PRODUCT_HELTEC_T114 Tff7b72= T79c0ff0xc2Tb4b4b4;
Tff7b72static Te6edf3MODEL_C6 Tff7b72= T79c0ff0xc6Tb4b4b4;
Tff7b72static Te6edf3MODEL_C7 Tff7b72= T79c0ff0xc7Tb4b4b4;

Tff7b72static Te6edf3PRODUCT_TBEAM Tff7b72= T79c0ff0xe0Tb4b4b4;
Tff7b72static Te6edf3MODEL_E4 Tff7b72= T79c0ff0xe4Tb4b4b4;
Tff7b72static Te6edf3MODEL_E9 Tff7b72= T79c0ff0xe9Tb4b4b4;
Tff7b72static Te6edf3MODEL_E3 Tff7b72= T79c0ff0xe3Tb4b4b4;
Tff7b72static Te6edf3MODEL_E8 Tff7b72= T79c0ff0xe8Tb4b4b4;

Tff7b72static Te6edf3PRODUCT_TBEAM_S_V1 Tff7b72= T79c0ff0xeaTb4b4b4;
Tff7b72static Te6edf3MODEL_DB Tff7b72= T79c0ff0xdbTb4b4b4;
Tff7b72static Te6edf3MODEL_DC Tff7b72= T79c0ff0xdcTb4b4b4;

Tff7b72static Te6edf3PRODUCT_TDECK Tff7b72= T79c0ff0xd0Tb4b4b4;
Tff7b72static Te6edf3MODEL_D4 Tff7b72= T79c0ff0xd4Tb4b4b4;
Tff7b72static Te6edf3MODEL_D9 Tff7b72= T79c0ff0xd9Tb4b4b4;

Tff7b72static Te6edf3PRODUCT_TECHO Tff7b72= T79c0ff0x15Tb4b4b4;
Tff7b72static Te6edf3MODEL_16 Tff7b72= T79c0ff0x16Tb4b4b4;
Tff7b72static Te6edf3MODEL_17 Tff7b72= T79c0ff0x17Tb4b4b4;

Tff7b72static Te6edf3PRODUCT_HMBRW Tff7b72= T79c0ff0xf0Tb4b4b4;
Tff7b72static Te6edf3MODEL_FF Tff7b72= T79c0ff0xffTb4b4b4;
Tff7b72static Te6edf3MODEL_FE Tff7b72= T79c0ff0xfeTb4b4b4;

Tff7b72static Te6edf3ADDR_PRODUCT Tff7b72= T79c0ff0x00Tb4b4b4;
Tff7b72static Te6edf3ADDR_MODEL Tff7b72= T79c0ff0x01Tb4b4b4;
Tff7b72static Te6edf3ADDR_HW_REV Tff7b72= T79c0ff0x02Tb4b4b4;
Tff7b72static Te6edf3ADDR_SERIAL Tff7b72= T79c0ff0x03Tb4b4b4;
Tff7b72static Te6edf3ADDR_MADE Tff7b72= T79c0ff0x07Tb4b4b4;
Tff7b72static Te6edf3ADDR_CHKSUM Tff7b72= T79c0ff0x0bTb4b4b4;
Tff7b72static Te6edf3ADDR_SIGNATURE Tff7b72= T79c0ff0x1bTb4b4b4;
Tff7b72static Te6edf3ADDR_INFO_LOCK Tff7b72= T79c0ff0x9bTb4b4b4;
Tff7b72static Te6edf3ADDR_CONF_SF Tff7b72= T79c0ff0x9cTb4b4b4;
Tff7b72static Te6edf3ADDR_CONF_CR Tff7b72= T79c0ff0x9dTb4b4b4;
Tff7b72static Te6edf3ADDR_CONF_TXP Tff7b72= T79c0ff0x9eTb4b4b4;
Tff7b72static Te6edf3ADDR_CONF_BW Tff7b72= T79c0ff0x9fTb4b4b4;
Tff7b72static Te6edf3ADDR_CONF_FREQ Tff7b72= T79c0ff0xa3Tb4b4b4;
Tff7b72static Te6edf3ADDR_CONF_OK Tff7b72= T79c0ff0xa7Tb4b4b4;

Tff7b72static Te6edf3INFO_LOCK_BYTE Tff7b72= T79c0ff0x73Tb4b4b4;
Tff7b72static Te6edf3CONF_OK_BYTE Tff7b72= T79c0ff0x73Tb4b4b4;

Tff7b72static Te6edf3BOARD_RNODE Tff7b72= T79c0ff0x31Tb4b4b4;
Tff7b72static Te6edf3BOARD_HMBRW Tff7b72= T79c0ff0x32Tb4b4b4;
Tff7b72static Te6edf3BOARD_TBEAM Tff7b72= T79c0ff0x33Tb4b4b4;
Tff7b72static Te6edf3BOARD_HUZZAH32 Tff7b72= T79c0ff0x34Tb4b4b4;
Tff7b72static Te6edf3BOARD_GENERIC_ESP32 Tff7b72= T79c0ff0x35Tb4b4b4;
Tff7b72static Te6edf3BOARD_LORA32_V2_0 Tff7b72= T79c0ff0x36Tb4b4b4;
Tff7b72static Te6edf3BOARD_LORA32_V2_1 Tff7b72= T79c0ff0x37Tb4b4b4;
Tff7b72static Te6edf3BOARD_RAK4631 Tff7b72= T79c0ff0x51Tb4b4b4;

Tff7b72static Te6edf3MANUAL_FLASH_MODELS Tff7b72= Tb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3MODEL_A1Tb4b4b4, Te6edf3ROMTb4b4b4.Te6edf3MODEL_A6Tb4b4b4]Tb4b4b4;

Tff7b72constructorTb4b4b4(Te6edf3eepromTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3eeprom Tff7b72= Te6edf3eepromTb4b4b4;
Tb4b4b4}

Te6edf3getProductTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_PRODUCTTb4b4b4]Tb4b4b4;
Tb4b4b4}

Te6edf3getModelTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_MODELTb4b4b4]Tb4b4b4;
Tb4b4b4}

Te6edf3getHardwareRevisionTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_HW_REVTb4b4b4]Tb4b4b4;
Tb4b4b4}

Te6edf3getSerialNumberTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_SERIALTb4b4b4]Tb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_SERIAL Tff7b72+ T79c0ff1Tb4b4b4]Tb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_SERIAL Tff7b72+ T79c0ff2Tb4b4b4]Tb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_SERIAL Tff7b72+ T79c0ff3Tb4b4b4]Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tb4b4b4}

Te6edf3getMadeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_MADETb4b4b4]Tb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_MADE Tff7b72+ T79c0ff1Tb4b4b4]Tb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_MADE Tff7b72+ T79c0ff2Tb4b4b4]Tb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_MADE Tff7b72+ T79c0ff3Tb4b4b4]Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tb4b4b4}

Te6edf3getChecksumTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3checksum Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72var Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff16Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3checksumTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CHKSUM Tff7b72+ Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3checksumTb4b4b4;
Tb4b4b4}

Te6edf3getSignatureTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3signature Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72var Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff128Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3signatureTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_SIGNATURE Tff7b72+ Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3signatureTb4b4b4;
Tb4b4b4}

Te6edf3getCalculatedChecksumTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3UtilsTb4b4b4.Te6edf3md5Tb4b4b4(Tb4b4b4[
Tff7b72thisTb4b4b4.Te6edf3getProductTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3getModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3getHardwareRevisionTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3getSerialNumberTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3getMadeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3getConfiguredSpreadingFactorTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_SFTb4b4b4]Tb4b4b4;
Tb4b4b4}

Te6edf3getConfiguredCodingRateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_CRTb4b4b4]Tb4b4b4;
Tb4b4b4}

Te6edf3getConfiguredTxPowerTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_TXPTb4b4b4]Tb4b4b4;
Tb4b4b4}

Te6edf3getConfiguredFrequencyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(
Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_FREQTb4b4b4] Tff7b72<< T79c0ff24Tb4b4b4) Tff7b72|
Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_FREQ Tff7b72+ T79c0ff1Tb4b4b4] Tff7b72<< T79c0ff16Tb4b4b4) Tff7b72|
Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_FREQ Tff7b72+ T79c0ff2Tb4b4b4] Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72|
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_FREQ Tff7b72+ T79c0ff3Tb4b4b4]
Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3getConfiguredBandwidthTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(
Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_BWTb4b4b4] Tff7b72<< T79c0ff24Tb4b4b4) Tff7b72|
Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_BW Tff7b72+ T79c0ff1Tb4b4b4] Tff7b72<< T79c0ff16Tb4b4b4) Tff7b72|
Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_BW Tff7b72+ T79c0ff2Tb4b4b4] Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72|
Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_BW Tff7b72+ T79c0ff3Tb4b4b4]
Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3isInfoLockedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_INFO_LOCKTb4b4b4] Tff7b72=== Te6edf3ROMTb4b4b4.Te6edf3INFO_LOCK_BYTETb4b4b4;
Tb4b4b4}

Te6edf3isConfiguredTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3eepromTb4b4b4[Te6edf3ROMTb4b4b4.Te6edf3ADDR_CONF_OKTb4b4b4] Tff7b72=== Te6edf3ROMTb4b4b4.Te6edf3CONF_OK_BYTETb4b4b4;
Tb4b4b4}

Te6edf3parseTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ensure info lock byte is set
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3isInfoLockedTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}

T8b949e// convert to hex
Tff7b72const Te6edf3checksumHex Tff7b72= Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3getChecksumTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3calculatedChecksumHex Tff7b72= Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3getCalculatedChecksumTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3signatureHex Tff7b72= Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3getSignatureTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;

T8b949e// add details
Tff7b72var Te6edf3details Tff7b72= Tb4b4b4{
Te6edf3is_provisionedTff7b72: Tff7b72trueTb4b4b4,
Te6edf3is_configuredTff7b72: Tff7b72thisTb4b4b4.Te6edf3isConfiguredTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3productTff7b72: Tff7b72thisTb4b4b4.Te6edf3getProductTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3modelTff7b72: Tff7b72thisTb4b4b4.Te6edf3getModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3hardware_revisionTff7b72: Tff7b72thisTb4b4b4.Te6edf3getHardwareRevisionTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3serial_numberTff7b72: Te6edf3UtilsTb4b4b4.Te6edf3unpackUInt32BETb4b4b4(Tff7b72thisTb4b4b4.Te6edf3getSerialNumberTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3madeTff7b72: Te6edf3UtilsTb4b4b4.Te6edf3unpackUInt32BETb4b4b4(Tff7b72thisTb4b4b4.Te6edf3getMadeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3checksumTff7b72: Te6edf3checksumHexTb4b4b4,
Te6edf3calculated_checksumTff7b72: Te6edf3calculatedChecksumHexTb4b4b4,
Te6edf3signatureTff7b72: Te6edf3signatureHexTb4b4b4,
Tb4b4b4}Tb4b4b4;

T8b949e// if configured, add configuration to details
Tff7b72if Tb4b4b4(Te6edf3detailsTb4b4b4.Te6edf3is_configuredTb4b4b4) Tb4b4b4{
Te6edf3details Tff7b72= Tb4b4b4{
Tb4b4b4...Te6edf3detailsTb4b4b4,
Te6edf3configured_spreading_factorTff7b72: Tff7b72thisTb4b4b4.Te6edf3getConfiguredSpreadingFactorTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3configured_coding_rateTff7b72: Tff7b72thisTb4b4b4.Te6edf3getConfiguredCodingRateTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3configured_tx_powerTff7b72: Tff7b72thisTb4b4b4.Te6edf3getConfiguredTxPowerTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3configured_frequencyTff7b72: Tff7b72thisTb4b4b4.Te6edf3getConfiguredFrequencyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3configured_bandwidthTff7b72: Tff7b72thisTb4b4b4.Te6edf3getConfiguredBandwidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e// if checksum in eeprom does not match checksum calculated from info, it is not provisioned
Tff7b72if Tb4b4b4(Te6edf3detailsTb4b4b4.Te6edf3checksum Tff7b72!== Te6edf3detailsTb4b4b4.Te6edf3calculated_checksumTb4b4b4) Tb4b4b4{
Te6edf3detailsTb4b4b4.Te6edf3is_provisioned Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3detailsTb4b4b4;
Tb4b4b4}
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────